home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / Blogowanie poza sfera / Flock 1.0 beta / flock-1.0RC3.en-US.win32.exe / flock / components / flockLogger.js < prev    next >
Text File  |  2007-10-18  |  11KB  |  316 lines

  1. //
  2. // BEGIN FLOCK GPL
  3. // 
  4. // Copyright Flock Inc. 2005-2007
  5. // http://flock.com
  6. // 
  7. // This file may be used under the terms of of the
  8. // GNU General Public License Version 2 or later (the "GPL"),
  9. // http://www.gnu.org/licenses/gpl.html
  10. // 
  11. // Software distributed under the License is distributed on an "AS IS" basis,
  12. // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  13. // for the specific language governing rights and limitations under the
  14. // License.
  15. // 
  16. // END FLOCK GPL
  17. //
  18.  
  19. const CC = Components.classes;
  20. const CI = Components.interfaces;
  21. const CR = Components.results;
  22.  
  23. Components.utils.import("resource:///modules/FlockXPCOMUtils.jsm");
  24. FlockXPCOMUtils.debug = false;
  25.  
  26. const MODULE_NAME = "Flock Logging";
  27.  
  28. // The Logging Service.
  29. const FLOCK_LOGGING_SERVICE_CLASS_NAME = "Flock Logging Service";
  30. const FLOCK_LOGGING_SERVICE_CLASS_ID =
  31.         Components.ID("{E8C889A6-F832-4B09-A216-66A7E6178896}");
  32. const FLOCK_LOGGING_SERVICE_CONTRACT_ID = "@flock.com/logging-service;1";
  33.  
  34. // The Logger; uses the Logging Service.
  35. const FLOCK_LOGGER_CLASS_NAME = "Flock Logger";
  36. const FLOCK_LOGGER_CLASS_ID =
  37.         Components.ID("{05428cec-9fd4-4955-afc9-eaaf4c6d9f9d}");
  38. const FLOCK_LOGGER_CONTRACT_ID = "@flock.com/logger;1";
  39.  
  40. const PREF_LOGGER_ENABLED = "flock.service.logger.enabled";
  41. const PREF_LOGGER_LEVEL = "flock.service.logger.level";
  42.  
  43. const NO_OVERRIDE_LEVEL = -1;
  44.  
  45. /**************************************************************************
  46.  * Component: Flock Logging Service
  47.  **************************************************************************/
  48.  
  49. // Constructor.
  50. function flockLoggingService() {
  51.  
  52.   this.setLevel(CI.flockILoggingService.LEVEL_ALL);
  53.  
  54.   this._observers = [];
  55.  
  56.   this._enabled = true;
  57.  
  58.   var catmgr = CC["@mozilla.org/categorymanager;1"]
  59.                .getService(CI.nsICategoryManager);
  60.   var enum = catmgr.enumerateCategory("flockILoggingObserver");
  61.   while (enum.hasMoreElements()) {
  62.     try {
  63.       var obj = enum.getNext();
  64.       var supportsString = obj.QueryInterface(CI.nsISupportsCString);
  65.       var shortName = supportsString.toString();
  66.       var cid = catmgr.getCategoryEntry("flockILoggingObserver", shortName);
  67.       var svc = CC[cid].getService(CI.flockILoggingObserver);
  68.       this.addObserver(svc);
  69.     } catch (ex) {
  70.       // Can't log it... just print message and ignore the error.
  71.       dump("flockLogger.js: cannot load registered "
  72.            + "flockILoggingObserver component.\n");
  73.     }
  74.   }
  75. }
  76.  
  77. /**************************************************************************
  78.  * Flock Logging Service: XPCOM Component Creation
  79.  **************************************************************************/
  80.  
  81. flockLoggingService.prototype = new FlockXPCOMUtils.genericComponent(
  82.   FLOCK_LOGGING_SERVICE_CLASS_NAME,
  83.   FLOCK_LOGGING_SERVICE_CLASS_ID,
  84.   FLOCK_LOGGING_SERVICE_CONTRACT_ID,
  85.   flockLoggingService,
  86.   CI.nsIClassInfo.SINGLETON,
  87.   [
  88.     CI.flockILoggingService,
  89.     CI.nsIObserver
  90.   ]
  91. );
  92.  
  93. // FlockXPCOMUtils.genericModule() categories
  94. flockLoggingService.prototype._xpcom_categories = [
  95.   { category: "app-startup", service: true }
  96. ];
  97.  
  98. /**************************************************************************
  99.  * Flock Logging Service: Private Data and Functions
  100.  **************************************************************************/
  101.  
  102. // Member variables.
  103. flockLoggingService.prototype._observers = null;
  104. flockLoggingService.prototype._level = null;
  105. flockLoggingService.prototype._enabled = null;
  106.  
  107. /**************************************************************************
  108.  * Flock Logging Service: flockILoggingService Implementation
  109.  **************************************************************************/
  110.  
  111. flockLoggingService.prototype.log =
  112. function flockLoggingService_log(aLevel, aOverrideLevel, aContext, aMessage) {
  113.  
  114.   var effectiveLevel = this._level;
  115.   if (aOverrideLevel > NO_OVERRIDE_LEVEL) {
  116.     effectiveLevel = aOverrideLevel;
  117.   }
  118.  
  119.   if (this._enabled) {
  120.     if (aLevel >= effectiveLevel) {
  121.       var date = new Date();
  122.       for each (var observer in this._observers) {
  123.         observer.emit(date.getTime(), aLevel, aContext, aMessage);
  124.       }
  125.     }
  126.   }
  127. }
  128.  
  129. flockLoggingService.prototype.setLevel =
  130. function flockLoggingService_setLevel(aLevel) {
  131.   var oldLevel = this._level;
  132.   this._level = aLevel;
  133.   return oldLevel;
  134. }
  135.  
  136. flockLoggingService.prototype.addObserver =
  137. function flockLoggingService_addObserver(aObserver) {
  138.   if (aObserver == null) {
  139.     throw CR.NS_ERROR_INVALID_ARG;
  140.   }
  141.   this._observers.push(aObserver);
  142. }
  143.  
  144. flockLoggingService.prototype.removeObserver =
  145. function flockLoggingService_removeObserver(aObserver) {
  146.   for (var i = 0; i < this._observers.length; i++) {
  147.     if (aObserver == this._observers[i]) {
  148.       this._observers.splice(i, 1);
  149.       break;
  150.     }
  151.   }
  152. }
  153.  
  154. /**************************************************************************
  155.  * Flock Logging Service: nsIObserver Implementation
  156.  **************************************************************************/
  157.  
  158. flockLoggingService.prototype.observe =
  159. function flockLoggingService_observe(aSubject, aTopic, aState) {
  160.  
  161.   var prefService = CC["@mozilla.org/preferences-service;1"]
  162.                     .getService(CI.nsIPrefBranch2);
  163.  
  164.   switch (aTopic) {
  165.     case "app-startup":
  166.       // These observers are required for the life of the application.
  167.       //
  168.       // Not removing them anywhere looks like a leak, but in fact it does
  169.       // not leak until the application exits, at which point it becomes moot.
  170.       //
  171.       // Also, the "quit-application" notification comes *before* the
  172.       // "profile-before-change" notification, which means we cannot use it
  173.       // to remove these observers, as we still need one of them.
  174.       var obs = CC["@mozilla.org/observer-service;1"]
  175.                 .getService(CI.nsIObserverService);
  176.       obs.addObserver(this, "profile-after-change", false);
  177.       obs.addObserver(this, "profile-before-change", false);
  178.       break;
  179.  
  180.     case "profile-after-change":  // Also called on startup.
  181.       // Ask for "nsPref:changed" notifications.
  182.       prefService.addObserver(PREF_LOGGER_ENABLED, this, false);
  183.       prefService.addObserver(PREF_LOGGER_LEVEL, this, false);
  184.       // Preload with current prefs.
  185.       this.observe(null, "nsPref:changed", null);
  186.       break;
  187.  
  188.     case "profile-before-change": // Also called on shutdown.
  189.       prefService.removeObserver(PREF_LOGGER_ENABLED, this);
  190.       prefService.removeObserver(PREF_LOGGER_LEVEL, this);
  191.       break;
  192.  
  193.     case "nsPref:changed":  // One of the above observers was triggered.
  194.       if (prefService.getPrefType(PREF_LOGGER_ENABLED)) {
  195.         this._enabled = prefService.getBoolPref(PREF_LOGGER_ENABLED);
  196.       } else {
  197.         this._enabled = true;
  198.       }
  199.       if (prefService.getPrefType(PREF_LOGGER_LEVEL)) {
  200.         this.setLevel(prefService.getIntPref(PREF_LOGGER_LEVEL));
  201.       } else {
  202.         this.setLevel(CI.flockILoggingService.LEVEL_WARN);
  203.       }
  204.       break;
  205.   }
  206.   this.log(CI.flockILoggingService.LEVEL_DEBUG,
  207.            NO_OVERRIDE_LEVEL,
  208.            "logger",
  209.            "observed '" + aTopic + "' notification");
  210. }
  211.  
  212. /**************************************************************************
  213.  * END Flock Logging Service
  214.  **************************************************************************/
  215.  
  216.  
  217. /**************************************************************************
  218.  * Component: Flock Logger
  219.  **************************************************************************/
  220.  
  221. // Constructor.
  222. function flockLogger() {
  223.   this._service = CC["@flock.com/logging-service;1"]
  224.                   .getService(CI.flockILoggingService);
  225. }
  226.  
  227. /**************************************************************************
  228.  * Flock Logger: XPCOM Component Creation
  229.  **************************************************************************/
  230.  
  231. flockLogger.prototype = new FlockXPCOMUtils.genericComponent(
  232.   FLOCK_LOGGER_CLASS_NAME,
  233.   FLOCK_LOGGER_CLASS_ID,
  234.   FLOCK_LOGGER_CONTRACT_ID,
  235.   flockLogger,
  236.   0, // nsIClassInfo flags
  237.   [CI.flockILogger]
  238. );
  239.  
  240. /**************************************************************************
  241.  * Flock Logger: Private Data and Functions
  242.  **************************************************************************/
  243.  
  244. // Member variables.
  245. flockLogger.prototype._service = null;
  246. flockLogger.prototype._context = null;
  247. flockLogger.prototype._overrideLevel = NO_OVERRIDE_LEVEL;
  248.  
  249. /**************************************************************************
  250.  * Flock Logger: flockILogger Implementation
  251.  **************************************************************************/
  252.  
  253. flockLogger.prototype.init =
  254. function flockLogger_init(aContext) {
  255.  
  256.   this._context = aContext;
  257.  
  258.   // See if we want to override the logging level for this module.
  259.   var myPrefLoggerLevel = PREF_LOGGER_LEVEL + "." + this._context;
  260.   var prefService = CC["@mozilla.org/preferences-service;1"]
  261.                     .getService(CI.nsIPrefBranch);
  262.   if (prefService.getPrefType(myPrefLoggerLevel)) {
  263.     this._overrideLevel = prefService.getIntPref(myPrefLoggerLevel);
  264.   }
  265. }
  266.  
  267. flockLogger.prototype.debug =
  268. function flockLogger_debug(aMessage) {
  269.   this._service.log(this._service.LEVEL_DEBUG,
  270.                     this._overrideLevel, this._context, aMessage);
  271. }
  272.  
  273. flockLogger.prototype.info =
  274. function flockLogger_info(aMessage) {
  275.   this._service.log(this._service.LEVEL_INFO,
  276.                     this._overrideLevel, this._context, aMessage);
  277. }
  278.  
  279. flockLogger.prototype.warn =
  280. function flockLogger_warn(aMessage) {
  281.   this._service.log(this._service.LEVEL_WARN,
  282.                     this._overrideLevel, this._context, aMessage);
  283. }
  284.  
  285. flockLogger.prototype.error =
  286. function flockLogger_error(aMessage) {
  287.   this._service.log(this._service.LEVEL_ERROR,
  288.                     this._overrideLevel, this._context, aMessage);
  289. }
  290.  
  291. flockLogger.prototype.fatal =
  292. function flockLogger_fatal(aMessage) {
  293.   this._service.log(this._service.LEVEL_FATAL,
  294.                     this._overrideLevel, this._context, aMessage);
  295. }
  296.  
  297. /**************************************************************************
  298.  * END Flock Logger
  299.  **************************************************************************/
  300.  
  301.  
  302. /**************************************************************************
  303.  * XPCOM Support - Module Construction
  304.  **************************************************************************/
  305.  
  306. // Create array of components.
  307. var gComponentsArray = [flockLoggingService, flockLogger];
  308.  
  309. // Generate a module for XPCOM to find.
  310. var NSGetModule = FlockXPCOMUtils.generateNSGetModule(MODULE_NAME,
  311.                                                       gComponentsArray);
  312.  
  313. /**************************************************************************
  314.  * END XPCOM Support
  315.  **************************************************************************/
  316.